
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTextArea;
import javax.swing.SpringLayout;

/**
 * clase que se encarga de ser la base para la interfaz cientifica y la interfaz normal
 */
public class Interfaz extends JFrame implements ActionListener
{
    /**
     * Campo de atributos protegidos 
     */
	protected Calculadora calc;
	protected JTextArea text;
        protected String resultado = "";
	protected JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b0;
	protected JButton basicBots[];
	protected String []stringBots = {"<-","CE","C","+-","sqrt"
									,"7","8","9","/","%"
									,"4","5","6","*","1/x"
									,"1","2","3","-","="
									,"0",".","+","(",")"};
	protected JPanel textPanel;
	protected JPanel butonPanel;
	
	protected JMenuBar menuBar;
	protected JMenu menu;
        protected JMenuItem ayuda;
    protected JRadioButtonMenuItem normal;
    protected  JRadioButtonMenuItem cientifica;

    /**
     * Metodo que usa una instancia de Calculadora para resolver la expresion
     */
	protected void calcular()
	{
		calc = new Calculadora(text.getText());
		calc.ponerEspacios();
		if(calc.isBalance())
		{
			calc.postfixExpression();
			System.out.println(calc.getPostfix());
			if(!calc.evaluateRPN())
			{
				text.setText("Syntax error");
			}
			else
                        {
                            resultado = calc.getDoubleResult().toString();
                            text.setText(text.getText() + "\n" + resultado);
                        }
		}
		else
		{			
			text.setText("Syntax error");
		}
	}
        /**
         * Metodo que se encarga de crear la interfaz de la calculadora basica y devolver el JPanel creado 
         */
	protected void crearNormal()
	{
		SpringLayout layB = new SpringLayout();
                
                text.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent keyevent) {
				char c = keyevent.getKeyChar();
                                
				if (c >= '0' && c <= '9' || c=='+'|| c=='*' || c=='-' ||
                                    c=='/' || c=='.' || c=='('|| c==')'|| c=='%') {
				}
                                else
                                {
					keyevent.consume();
				}
                                
                                
                        }
		
		});
                
		butonPanel = new JPanel(layB);
		basicBots = new JButton[stringBots.length];
		
		for(int i=0;i<stringBots.length;i++)
		{
			basicBots[i] = new JButton(stringBots[i]);
			basicBots[i].addActionListener(this);
			butonPanel.add(basicBots[i]);
		}
		SpringUtilities.makeCompactGrid(butonPanel, 5, 5, 5, 10, 5, 5);
	}
	/**
         * Metodo que se encarga de crear el JMenuBar con Modo y opciones que van a permitir cambiar de modo y
         * mostrar la ayuda
         * @param  tipo define si que modo va a estar seleccionado
         * @return  devuelve JMenuBar ya creado
         */
	public JMenuBar createMenuBar(int tipo) {
    	

        //Create the menu bar.
        menuBar = new JMenuBar();

        //Build the first menu.
        menu = new JMenu("Modo");
        menu.setMnemonic(KeyEvent.VK_M);
        menu.getAccessibleContext().setAccessibleDescription(
                "Normal o cientifica");
        menuBar.add(menu);
        
        ayuda = new JMenuItem("Ayuda");
        ayuda.setMnemonic(KeyEvent.VK_A);
        menuBar.add(ayuda);
        ayuda.addActionListener(this);


        //a group of radio button menu items
        ButtonGroup group = new ButtonGroup();

        normal = new JRadioButtonMenuItem("Normal");
      
        normal.setMnemonic(KeyEvent.VK_N);
        group.add(normal);
        menu.add(normal);

        cientifica = new JRadioButtonMenuItem("Cientifica");
        cientifica.setMnemonic(KeyEvent.VK_C);
        
        if(tipo == 1)
        	normal.setSelected(true);
        else
        	cientifica.setSelected(true);
        group.add(cientifica);
        menu.add(cientifica);

        return menuBar;
    }
	/**
         * Metodo encargado de manejar los eventos de los botones
         * @param  e Es el evento a utilizar  
         */
	public void actionPerformed(ActionEvent e)
	{
            if(e.getSource() == ayuda)
            {
                System.out.print("manual");
                Manual man = new Manual();
                man.setVisible(true);
            }
            if(resultado != "")
            {
                text.setText(resultado);
                resultado = "";
            }
            
            if(e.getSource() == basicBots[2])
		text.setText("");
            else if(e.getSource() == basicBots[0] || e.getSource() == basicBots[1])
            {
                if(text.getText().length() !=0)
                    text.setText(text.getText().substring(0, text.getText().length()-1));
            }
            else if(e.getSource() == basicBots[3])
            {
                text.setText( text.getText()+ "-(");
            }
            if(e.getSource() == basicBots[4])
            {
                text.setText( text.getText()+((JButton)e.getSource()).getText()+'(');
            }
            
		
            for(int i=5;i<basicBots.length;i++)
            {
                
            	if(e.getSource() == basicBots[i])
            	{
                    if(i==19)
                    {
                        calcular();
                    }
                    else if(i==9)
                    {
                        Calculadora temp = new Calculadora(text.getText());
                        temp.ponerEspacios();
                        if(temp.isBalance())
                        {
            			temp.postfixExpression();
                		if(!temp.evaluateRPN())
                        	{
                                    text.setText("syntax error");
                                }
                                else    
                                {
                                    double v = temp.getDoubleResult();
                                    String res = Calculadora.porcentaje(v+"");                                  
                                    text.setText(res);
                                }
                        }
                        else    
                            text.setText("syntax error");
                        
                        
                    }
                    else if(i==14)
                    {
                         Calculadora temp = new Calculadora(text.getText());
                         text.setText( temp.inverso() );
                    }
                    else
                    {
                        text.setText( text.getText()+((JButton)e.getSource()).getText());
                    }
            	}
            }
		
	}
       
	/**
         * Se encarga de poner un titulo, hacer que se cierre y alinear la posicion del frame
         * @param  titulo especifica el titulo para el JFrame
         */
	public Interfaz(String titulo)
	{
		
		super(titulo);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                setLocationRelativeTo(null);
	}

}
